home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / machserver / 1.098 / libc / frexp.c < prev    next >
C/C++ Source or Header  |  1990-09-11  |  2KB  |  75 lines

  1. /* 
  2.  * frexp.c --
  3.  *
  4.  *    frexp math routine..
  5.  *
  6.  */
  7.  
  8. #ifndef lint
  9. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/frexp.c,v 1.2 90/09/11 14:18:33 kupfer Exp $ SPRITE (Berkeley)";
  10. #endif /* not lint */
  11.  
  12. #include <math.h>
  13.  
  14. /* 
  15.  * math.h provides inline definitions for using the 68881 coprocessor 
  16.  * on a sun3.  frexp is one of the functions that gets inlined.
  17.  */
  18.  
  19. #if defined(__STDC__) && defined(sun3) && !defined(__STRICT_ANSI__) \
  20.   && !defined(__SOFT_FLOAT__)
  21.  
  22. /* use the inline definition */
  23.  
  24. #else
  25.  
  26.  
  27. /*
  28.  *----------------------------------------------------------------------
  29.  *
  30.  * frexp --
  31.  *
  32.  *    Describe the given argument as two numbers, x and i, where 
  33.  *    arg = x * (2**i).
  34.  *
  35.  * Results:
  36.  *    Returns the multiplier "x", which is always less than 1.0 in 
  37.  *    absolute value.
  38.  *
  39.  * Side effects:
  40.  *    Stores the integer exponent "i" at the address pointed to.
  41.  *
  42.  *----------------------------------------------------------------------
  43.  */
  44.     
  45. double
  46. frexp(x, i)
  47.         double x;
  48.         int *i;
  49. {
  50.         int neg, j;
  51.  
  52.         j = 0;
  53.         neg = 0;
  54.         if (x<0) {
  55.                 x = -x;
  56.                 neg = 1;
  57.         }
  58.         if (x>1.0)
  59.                 while (x>1) {
  60.                         j = j+1;
  61.                         x = x/2;
  62.                 }
  63.         else if (x<0.5)
  64.                 while(x<0.5) {
  65.                         j = j-1;
  66.                         x = 2*x;
  67.                 }
  68.         *i = j;
  69.         if(neg)
  70.                 x = -x;
  71.         return (x);
  72. }
  73.  
  74. #endif /* inline test */
  75.